Linux C API 获取广播地址
广播地址通常为网段的最后一个地址
通过对一个 socket 进行 ioctl(SIOCGIFBRDADDR) 即可获取广播地址。
1struct ifreq req;
2strcpy(req.ifr_name, "网卡名");
3ioctl(sock, SIOCGIFBRDADDR, &req);
4inet_ntoa(((struct sockaddr_in*)&(req.ifr_addr))->sin_addr)遍历网卡的方法可以参考 Linux C API 获取本机的 IP 地址
示例:
1#include <cstdio>
2#include <cstdlib>
3#include <cstring>
4#include <cerrno>
5
6#include <unistd.h>
7#include <sys/socket.h>
8#include <arpa/inet.h>
9#include <net/if.h>
10#include <sys/ioctl.h>
11
12bool getBoardCastAddress(const char* iface, char* buffer, size_t n)
13{
14 int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
15 if (sock < 0)
16 {
17 fprintf(stderr, "socket: %s\n", strerror(errno));
18 return false;
19 }
20
21
22 struct ifreq req;
23 strcpy(req.ifr_name, iface);
24 if (ioctl(sock, SIOCGIFBRDADDR, &req) < 0)
25 {
26 fprintf(stderr, "ioctl: %s\n", strerror(errno));
27 close(sock);
28 return false;
29 }
30
31 strncpy(buffer, inet_ntoa(((struct sockaddr_in*)&(req.ifr_addr))->sin_addr), n);
32 close(sock);
33 return true;
34}
35
36int main(void)
37{
38 char addr[INET_ADDRSTRLEN];
39 if (!getBoardCastAddress("enp2s0", addr, INET_ADDRSTRLEN))
40 {
41 return EXIT_FAILURE;
42 }
43
44 printf("broadcast %s\n", addr);
45 return EXIT_SUCCESS;
46}